from pathlib import Path

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
# 数据库配置文件
from app.config import config_map
# 自定义flask数据库操作命令
from app.commands import register_commands
# 注册蓝图
from .routers import main_bp
from .models import db


def create_app(config_name: str = "dev") -> Flask:
    """
    应用工厂函数：创建并配置Flask应用
    :param config_name: 环境名称（dev/prod）
    :return: 配置好的Flask应用实例
    """
    # 转换为绝对路径（避免相对路径歧义，推荐）
    # Path.cwd() → 项目根目录（my-flask/），因为 Flask 启动时默认在根目录
    template_dir = str(Path.cwd() / "templates")
    static_dir = str(Path.cwd() / "static")

    # 1.Flask应用初始化，创建应用实例
    app = Flask(__name__, template_folder=template_dir, static_folder=static_dir)
    app.config.from_object(config_map[config_name])

    # 2.加载配置（从config.py中读取对应环境的配置）
    app.config.from_object(config_map[config_name])

    # 3.初始化扩展（关联Flask应用）
    db.init_app(app)

    # 4.注册自定义命令（数据库相关）
    register_commands(app)

    # 5.注册蓝图（路由模块）
    app.register_blueprint(main_bp)  # 通用路由（主页、仪表盘、错误页）

    return app
